package com.kx.handel;

import com.kx.exception.AgeException;
import com.kx.exception.NameException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

/**
 * ControllerAdvice：控制器增强————异常处理
 *
 * 特点：必须让框架知道此注解所在的包名，需要在springmvc配置文件声明组件扫描器
 * 指定@ControllerAdvice所在的包名
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    //定义方法，处理异常的方法
    /**
     * 处理异常的方法和控制器方法的定义一样，可以有多个参数，可以有ModelAndView
     * String，void，对象等类型的返回值
     *
     * 形参：Exception，表示Controller中抛出的异常对象。
     * 通过形参可以获取发生的异常信息。
     *
     * @ExceptionHanlder（异常的class）：表示异常的类型，当发生此类型异常是，由当前方法处理
     */
    @ExceptionHandler(value = NameException.class)
    public ModelAndView doNameException(Exception ex){
        //处理NameException异常
        /*
            异常发生处理逻辑：
            1、需要把异常记录下来，记录到数据库，日志文件
                记录日志发生的时间，哪个方法发生的，异常错误内容。
            2、发送通知，把异常信息通过邮件、短信、微信发送给相关人员
            3、给用户友好的提示。

         */
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","项目必须是zs，其他用户不能访问");
        mv.addObject("ex",ex);
        mv.setViewName("nameError");
        return mv;
    }
    @ExceptionHandler(value = AgeException.class)
    public ModelAndView doAgeException(Exception ex){
        //处理NameException异常
        /*
            异常发生处理逻辑：
            1、需要把异常记录下来，记录到数据库，日志文件
                记录日志发生的时间，哪个方法发生的，异常错误内容。
            2、发送通知，把异常信息通过邮件、短信、微信发送给相关人员
            3、给用户友好的提示。

         */
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","年龄必须大于80");
        mv.addObject("ex",ex);
        mv.setViewName("ageError");
        return mv;
    }
    //处理除nameException、ageException其他未知异常
    @ExceptionHandler
    public ModelAndView doOtherException(Exception ex){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","年龄必须大于80");
        mv.addObject("ex",ex);
        mv.setViewName("defaultError");
        return mv;
    }
}
